package pers.xiaojun.boot.module.system.service.oauth2;

import cn.hutool.core.util.IdUtil;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import pers.xiaojun.boot.common.config.properties.OAuth2Properties;
import pers.xiaojun.boot.module.system.dao.redis.oauth2.OAuth2CodeRedisDAO;
import pers.xiaojun.boot.module.system.service.oauth2.dto.OAuth2CodeCreateDTO;
import pers.xiaojun.boot.module.system.service.oauth2.dto.OAuth2CodeDTO;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 授权码服务类
 *
 * @author xiaojun
 * @since 2025-10-18
 */
@Service
@RequiredArgsConstructor
public class OAuth2CodeServiceImpl implements OAuth2CodeService {

    private final OAuth2CodeRedisDAO oAuth2CodeRedisDAO;
    private final OAuth2Properties oAuth2Properties;

    @Override
    public OAuth2CodeDTO createAuthorizationCode(String clientId, Long userId, List<String> scopes, String redirectUri, String state) {
        OAuth2CodeDTO oAuth2CodeDTO = OAuth2CodeDTO.builder()
                .code(generateCode())
                .state(state)
                .scopes(scopes)
                .userId(userId)
                .clientId(clientId)
                .redirectUri(redirectUri)
                .expiresTime(LocalDateTime.now().plusSeconds(oAuth2Properties.getCodeExpiresIn()))
                .build();
        oAuth2CodeRedisDAO.set(oAuth2CodeDTO);
        return oAuth2CodeDTO;
    }

    @Override
    public OAuth2CodeDTO getOAuth2CodeByCode(String code) {
        return oAuth2CodeRedisDAO.get(code);
    }

    @Override
    public boolean deleteOAuth2CodeByCode(String code) {
        return oAuth2CodeRedisDAO.delete(code);
    }


    /**
     * 生成授权码
     */
    private static String generateCode() {
        return IdUtil.fastSimpleUUID();
    }

}
